package com.hsurosy.trigger.job;

import com.hsurosy.domain.strategy.model.valobj.StrategyAwardStockKeyVO;
import com.hsurosy.domain.strategy.service.IRaffleStock;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * @Author Hsu琛君珩
 * @Date 2024-10-21 20:31
 * @Description 定时任务 - 更新奖品库存
 * @Version: v1.0.0
 */
@Slf4j
@Component()
public class UpdateAwardStockJob {

    @Resource
    private IRaffleStock raffleStock; // 抽奖库存服务接口

    /**
     * 定时执行的方法，使用 Spring 的 @Scheduled 注解
     * 该任务每 5 秒钟执行一次，从 Redis 延迟队列中获取奖品库存消耗信息，并更新数据库中的库存。
     *
     * @Scheduled(cron = "0/5 * * * * ?") 表示每5秒执行一次
     */
    @Scheduled(cron = "0/5 * * * * ?")
    public void exec() {
        try {
            // 从 Redis 队列中获取需要更新库存的奖品信息
            StrategyAwardStockKeyVO strategyAwardStockKeyVO = raffleStock.takeQueueValue();
            if (null == strategyAwardStockKeyVO) {
                return;  // 如果队列中没有数据，直接返回，等待下次执行
            }

            // 记录日志，显示从队列中获取的策略ID和奖品ID
            log.info("定时任务，更新奖品消耗库存 strategyId: {} awardId: {}", strategyAwardStockKeyVO.getStrategyId(), strategyAwardStockKeyVO.getAwardId());

            // 调用服务，更新数据库中的奖品库存
            raffleStock.updateStrategyAwardStock(strategyAwardStockKeyVO.getStrategyId(), strategyAwardStockKeyVO.getAwardId());

        } catch (Exception e) {
            // 捕获异常并记录日志，确保任务不会因为异常停止
            log.error("定时任务，更新奖品消耗库存失败", e);
        }
    }

}
